From c486c0983f5289b3668b0a055903b5f6b84bf2aa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 6 Nov 2013 14:33:19 +0100 Subject: [PATCH] gdk/win32: remove extra allocation for \r removal Although I can't find explicit documentation for clipboard pointer, it seems to be possible to modify clibpoard memory without side-effects. According to MSDN, http://msdn.microsoft.com/en-us/library/windows/desktop/aa366596%28v=vs.85%29.aspx "The global and local functions are supported for porting from 16-bit code, or for maintaining source code compatibility with 16-bit Windows. Starting with 32-bit Windows, the global and local functions are implemented as wrapper functions that call the corresponding heap functions using a handle to the process's default heap." "Memory objects allocated by GlobalAlloc and LocalAlloc are in private, committed pages with read/write access that cannot be accessed by other processes. Memory allocated by using GlobalAlloc with GMEM_DDESHARE is not actually shared globally as it is in 16-bit Windows. This value has no effect and is available only for compatibility. " https://bugzilla.gnome.org/show_bug.cgi?id=711553 --- gdk/win32/gdkselection-win32.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/gdk/win32/gdkselection-win32.c b/gdk/win32/gdkselection-win32.c index 75e3d21469..c2a0893645 100644 --- a/gdk/win32/gdkselection-win32.c +++ b/gdk/win32/gdkselection-win32.c @@ -530,21 +530,20 @@ _gdk_win32_display_convert_selection (GdkDisplay *display, if ((hdata = GetClipboardData (CF_UNICODETEXT)) != NULL) { - wchar_t *ptr, *wcs, *p, *q; + wchar_t *ptr, *p, *q; guchar *data; glong length, wclen; if ((ptr = GlobalLock (hdata)) != NULL) { length = GlobalSize (hdata); - + GDK_NOTE (DND, g_print ("... CF_UNICODETEXT: %ld bytes\n", length)); /* Strip out \r */ - wcs = g_new (wchar_t, length / 2 + 1); p = ptr; - q = wcs; + q = ptr; wclen = 0; while (p < ptr + length / 2) { @@ -556,8 +555,7 @@ _gdk_win32_display_convert_selection (GdkDisplay *display, p++; } - data = g_utf16_to_utf8 (wcs, wclen, NULL, NULL, NULL); - g_free (wcs); + data = g_utf16_to_utf8 (ptr, wclen, NULL, NULL, NULL); if (data) selection_property_store (requestor, _utf8_string, 8, -- 2.30.2